#!c:/Python27/python.exe -u
# -*- coding: utf-8/IGNORE',$string);-*-
''' Tema - Linguagens de Programação Dinâmicas
Trabalho de Python á Discíplina - Linguagens de Programação

Interface.py tem como função construir toda a interface gráfcica da aplicação
Depois de efectuar a ligação a Base de dados, realiza a leitura dos mesmos passandos por filtros 
A cada função da classe, possui filtros que retornam os valores de cada coluna da Base de Dados 
'''
__author__ = "Miguel Fialho, Nº 5958 - Pedro Serrano, Nº 3958"
__copyright__ = "Copyright 2014 - Miguel Fialho / Pedro Serrano"
__credits__ = ""
__license__ = "GPL"
__maintainer__ = "1.0"
__email__ = "mF200_5@hotmail.com"
__status__ = ""

from Tkinter import *
from Reports import*
import Reports
import Graphs
from Graphs import*
import Histograms
from Histograms import*
import tkMessageBox
import Tkinter
import os
import tkFileDialog
import ReadFile
from pylab import*
from ReadFile import *
from Statistics import *
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

filename = 'IPC_Portugal_1977_2013.xls'

class Application(Frame):
    
    def __DeleteBD__(self):
        '''
        metodo para apagar a base de dados
        e actualizar a listbox em conformidade
        '''
        accoesbd = ReadFile.AccoesBD
        try: 
            accoesbd().__dropBD__() 
            tkMessageBox.showinfo("A Base de Dados foi Apagada com sucesso!")
        except:
            tkMessageBox.showinfo("Except!", "A Base de Dados já não exite por isso não pode ser apagada")   
        self.destroy()  # destroy e volta a inicializar a janela para poder actualizar a listbox
        self.__init__()
        pass
    

    def __CriarBD__(self):
        '''
        metodo para criar a base de dados a partir do ficheiro .xls
        e actualizar a interface(listbox) em conformidade
        '''
        t0 = time.clock()
        print "Iniciou a criação da Base de Dados em" ,time.clock() - t0, "segundos"
        accoesbd = ReadFile.AccoesBD
        tkMessageBox.showinfo("AGUARDE", "AGUARDE, A ESCREVER NA BASE DE DADOS...")
        accoesbd().__create_database__()
        try:
            accoesbd().__insert__()
            print "Tempo que Demora abrir a aplicação, ",time.time() - t0, "segundos "
            tkMessageBox.showinfo("Base de Dados","Gravada com Sucesso!")
        except Exception:
            tkMessageBox.showinfo("A Base de Dados já Existe ")
        self.destroy()  # destroy e volta a inicializar a janela para poder actualizar a listbox
        self.__init__()
        pass

    def about(self):
        '''
        Método para criar a janela que contém informações sobre o Programa Análise Estatistica
        '''
        top = Toplevel()
        top.title("Sobre, Análise Estatistica de Salários Portugueses")
        explanation = """Análise Estatistica de Salários Portugueses
        Version.: 1.0 
        Termos.: GPL
        Author.: Miguel Fialho
                       Pedro Serrano."""
        w = Label(top).pack(side="right")
        w2 = Label(top, justify=LEFT,padx = 10,text=explanation).pack(side="left")
        pass

    def createWidgets(self):
        '''
        Método para criar toda a janela/ambiente gráfico da aplicação
        '''
        self.menubar = Menu(self)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Ficheiro", menu=menu)
        menu.add_command(label="Criar Base de Dados", command=self.__CriarBD__)
        menu.add_separator()
        menu.add_command(label="Quit!", command=quit)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Statistical Graphs", menu=menu)
        menu.add_command(label="Consumer Price Index", command=self.__GraphIPC__)
        menu.add_command(label="Inflaction", command=self.__GraphInflaction__)
        menu.add_command(label="Minimum Remuneration", command=self.__GraphMinRemuneration__)
        menu.add_command(label="Maximum Remuneration", command=self.__GraphMaxRemuneration__)
        menu.add_command(label="Minimum-Maximum Remuneration", command=self.__GraphMinMaxRemuneration__)
        menu.add_command(label="PIB", command=self.__GraphPib__)
        menu.add_command(label="National Remuneration", command=self.__GraphNationalRemuneration__)
        menu.add_command(label="Disposable Remuneration", command=self.__GraphDisposableRemuneration__)
        menu.add_command(label="Per Capita Annual Remuneration", command=self.__GraphPerCapitaAnnualRemuneration__)
        menu.add_separator()
        menu.add_command(label="Consumer Price Index - 3D", command=self.__GraphIpc3D__)
        menu.add_command(label="Inflaction - 3D", command=self.__GraphInflation3D__)
        menu.add_command(label="Minimum Remuneration - 3D", command=self.__GraphMinimumRemuneration3D__)
        menu.add_command(label="Maximum Remuneration - 3D", command=self.__GraphMaximumRemuneration3D__)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Statistical Histograms", menu=menu)
        menu.add_command(label="Consumer Price Index", command=self.__HistogramIpc__)
        menu.add_command(label="Inflaction", command=self.__HistogramInflation__)
        menu.add_command(label="Minimum Remuneration", command=self.__HistogramMinimumRemuneration__)
        menu.add_command(label="Maximum Remuneration", command=self.__HistogramMaximumRemuneration__)
        menu.add_command(label="Minimum-Maximum Remuneration", command=self.__HistogramMinimumMaximumRemuneration__)
        menu.add_command(label="PIB", command=self.__HistogramPib__)
        menu.add_command(label="National Remuneration", command=self.__HistogramNationalRemuneration__)
        menu.add_command(label="Disposable Remuneration", command=self.__HistogramDisposableRemuneration__)
        menu.add_command(label="Per Capita Annual Remuneration", command=self.__HistogramAnnualRemuneration__)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Reports", menu=menu)
        menu.add_command(label="Consumer Price Index - PDF", command=self.__ReportIpc__)
        self.master.config(menu=self.menubar)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Help", menu=menu)
        menu.add_command(label="Análise Estatistica de Salários Portugueses, Ajuda")
        menu.add_command(label="Sobre, Análise Estatistica de Salários Portugueses", command=self.about)
        self.master.config(menu=self.menubar)
        self.labellist = Label(self, text="Dados Estatisticos da Função Pública Portuguesa")
        self.labellist["fg"]="red"
        self.labellist.pack()
        
        # listbox para listar os dados
        self.lista_ano = Listbox(self)
        self.lista_ipc = Listbox(self)
        self.lista_inflacao = Listbox(self)
        self.lista_rum_minima = Listbox(self)
        self.lista_rem_maxima = Listbox(self)
        self.lista_pib = Listbox(self)
        self.lista_rem_nac = Listbox(self)
        self.lista_rem_disp = Listbox(self)
        self.lista_remu_capital = Listbox(self)
        self.lista_ano.config(width = 5, height = 37)
        self.lista_ipc.config(width = 18, height = 37)
        self.lista_inflacao.config(width = 18, height = 37)
        self.lista_rum_minima.config(width = 5, height = 37)
        self.lista_rem_maxima.config(width = 7, height = 37)
        self.lista_pib.config(width = 10, height = 37)
        self.lista_rem_nac.config(width = 10, height = 37)
        self.lista_rem_nac.config(width = 10, height = 37)
        self.lista_rem_disp.config(width = 10, height = 37)
        self.lista_remu_capital.config(width = 10, height = 37)
        self.lista_ano.pack(side = LEFT)
        self.lista_ipc.pack(side = LEFT)
        self.lista_inflacao.pack(side = LEFT)
        self.lista_rum_minima.pack(side = LEFT)
        self.lista_rem_maxima.pack(side = LEFT)
        self.lista_pib.pack(side = LEFT)
        self.lista_rem_nac.pack(side = LEFT)
        self.lista_rem_disp.pack(side = LEFT)
        self.lista_remu_capital.pack(side = LEFT)
        for i in range (0, 38):
            if os.path.isfile("DataBase.db") == True:
                self.lista_ano.insert( i ,Statistics().getAno(i))
                self.lista_ipc.insert( i ,Statistics().getIpc_global(i))
                self.lista_inflacao.insert( i ,Statistics().getInflacao(i))
                self.lista_rum_minima.insert( i ,Statistics().getRum_minima(i))
                self.lista_rem_maxima.insert( i ,Statistics().getRum_maxima(i))
                self.lista_pib.insert( i ,Statistics().getPib(i))
                self.lista_rem_nac.insert( i ,Statistics().getRem_nac(i))
                self.lista_rem_disp.insert( i ,Statistics().getRem_disp(i))
                self.lista_remu_capital.insert( i ,Statistics().getRemu_capital(i))
                pass

    def __GraphIPC__ (self):
        '''
        Método para criar gráfico IPC Global
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico IPC Global em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphIPC(self)
        print "Gráfico IPC Global, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphInflaction__ (self):
        '''
        Método para criar gráfico Taxa de Inflação
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Taxa de Inflação em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphInflation(self)
        print "Gráfico Taxa de Inflação, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphMinRemuneration__ (self):
        '''
        Método para criar gráfico Remuneração Minima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Remuneração Minima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphMinimumRemuneration(self)
        print "Gráfico Remuneração Minima, esteve aberto durante, ",time.time() - t0, "segundos"
    pass

    def __GraphMaxRemuneration__ (self):
        '''
        Método para criar gráfico Remuneração Máxima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Remuneração Máxima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphMaximumRemuneration(self)
        print "Gráfico Remuneração Máxima, esteve aberto durante, ",time.time() - t0, "segundos"
    pass

    def __GraphMinMaxRemuneration__ (self):
        '''
        Método para criar gráfico Remuneração Minima e Máxima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Remuneração Minima e Máxima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphMinimumMaximumRemuneration(self)
        print "Gráfico Remuneração Minima e Máxima, esteve aberto durante, ",time.time() - t0, "segundos"
    pass

    def __GraphPib__ (self):
        '''
        Método para criar gráfico Produto Interno Bruto
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Produto Interno Bruto em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphPIB(self)
        print "Gráfico Produto Interno Bruto, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphNationalRemuneration__ (self):
        '''
        Método para criar gráfico Remuneração Nacional
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Remuneração Nacional em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphNationalRemuneration(self)
        print "Gráfico Remuneração Nacional, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphDisposableRemuneration__ (self):
        '''
        Método para criar gráfico Remuneração Disponivel
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico Remuneração Disponivel em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphDisposableRemuneration(self)
        print "Gráfico Remuneração Disponivel, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphPerCapitaAnnualRemuneration__ (self):
        '''
        Método para criar gráfico Remunerações Capital anual per capita
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphPerCapitaAnnualRemuneration(self)
        print "Gráfico Remunerações Capital anual per capita, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphIpc3D__ (self):
        '''
        Método para criar gráfico 3D IPC Global
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico 3D IPC Global em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphIpc3D(self)
        print "Gráfico 3D IPC Global, esteve aberto durante, ",time.time() - t0, "segundos"
    pass

    def __GraphInflation3D__ (self):
        '''
        Método para criar gráfico 3D Taxa de Inflação
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico 3D Taxa de Inflação em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphInflation3D(self)
        print "Gráfico 3D Taxa de Inflação, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphMinimumRemuneration3D__ (self):
        '''
        Método para criar gráfico 3D Remuneração Minima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico 3D Remuneração Minima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphMinimumRemuneration3D(self)
        print "Gráfico 3D Remuneração Minima, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __GraphMaximumRemuneration3D__ (self):
        '''
        Método para criar gráfico 3D Remuneração Máxima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o gráfico 3D Remuneração Máxima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Graphs.GraphMaximumRemuneration3D(self)
        print "Gráfico 3D Remuneração Máxima, esteve aberto durante, ",time.time() - t0, "segundos "
    pass


    def __HistogramIpc__ (self):
        '''
        Método para criar histograma IPC Global
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma IPC Global em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramIPC(self)
        print "Histograma IPC Global, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __HistogramInflation__ (self):
        '''
        Método para criar histograma Taxa de Inflação
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Taxa de Inflação em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramInflation(self)
        print "Histograma Taxa de Inflação, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __HistogramMinimumRemuneration__ (self):
        '''
        Método para criar histograma Remuneração Minima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remuneração Minima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramMinimumRemuneration(self)
        print "Histograma Remuneração Minima, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __HistogramMaximumRemuneration__ (self):
        '''
        Método para criar histograma Remuneração Máxima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remuneração Máxima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramMaximumRemuneration(self)
        print "Histograma Remuneração Máxima, esteve aberto durante, ",time.time() - t0, "segundos "
    pass

    def __HistogramMinimumMaximumRemuneration__(self):
        '''
        Método para criar histograma Remuneração Minima e Máxima
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remuneração Minima e Máxima em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramMinimumMaximumRemuneration(self)
        print "Histograma Remuneração Minima e Máxima, esteve aberto durante, ",time.time() - t0, "segundos "
        pass

    def __HistogramPib__(self):
        '''
        Método para criar histograma Produto Interno Bruto
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Produto Interno Bruto em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramPIB(self)
        print "Histograma Produto Interno Bruto, esteve aberto durante, ",time.time() - t0, "segundos "
        pass

    def __HistogramNationalRemuneration__(self):
        '''
        Método para criar histograma Remuneração Nacional
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remuneração Nacional em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramNationalRemuneration(self)
        print "Histograma Remuneração Nacional, esteve aberto durante, ",time.time() - t0, "segundos "
        pass

    def __HistogramDisposableRemuneration__(self):
        '''
        Método para criar histograma Remuneração Disponivel
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remuneração Disponivel em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramDisposableRemuneration(self)
        print "Histograma Remuneração Disponivel, esteve aberto durante, ",time.time() - t0, "segundos "
        pass

    def __HistogramAnnualRemuneration__(self):
        '''
        Método para criar histograma Remunerações Capital anual per capita
        '''
        t0 = time.clock() # tempo de execução
        print "Abriu o histograma Remunerações Capital anual per capita em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Histograms.HistogramPerCapitaAnnualRemuneration(self)
        print "Histograma Remunerações Capital anual per capita, esteve aberto durante, ",time.time() - t0, "segundos "
        pass
    
    def __ReportIpc__ (self):
        '''
        Método para criar Relatório de IPC Global
        '''
        t0 = time.clock() # tempo de execução
        print "Gerou o relatório PDF em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Reports.pdf(self)
        print "Tempo que Demora abrir o relatório, ",time.time() - t0, "segundos "

    pass

    def __init__(self, master=None):
        '''
        Métudo para iniciação de todos as funções da classe Application
        O Frame é passado como parametro para que possa ser iniciado
        '''
        t0 = time.clock() # tempo de execução
        print "Aplicação Iniciada em " ,time.clock() - t0, "segundos"
        t0 = time.time() # tempo total de execução
        Frame.__init__(self, master)
        self.pack() 
        self.createWidgets()
        print "Tempo que Demora abrir a aplicação, ",time.time() - t0, "segundos "
        pass